package com.campus.help.controller.admin;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.campus.help.common.PageResult;
import com.campus.help.common.Result;
import com.campus.help.entity.Labor;
import com.campus.help.service.LaborService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 管理员劳务管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/admin/labors")
public class AdminLaborController {

    @Autowired
    private LaborService laborService;

    /**
     * 测试接口
     * @return 测试结果
     */
    @GetMapping("/test")
    public Result<String> test() {
        return Result.success("劳务管理接口正常工作");
    }

    /**
     * 分页查询劳务列表
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键词
     * @param status 状态
     * @return 分页结果
     */
    @GetMapping
    public Result<PageResult<Labor>> getLaborPage(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "20") Integer size,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) String status) {

        try {
            log.info("查询劳务列表，页码：{}，每页大小：{}，关键词：{}，状态：{}", page, size, keyword, status);

            IPage<Labor> result = laborService.getLaborList(page, size, keyword, null, null, null, null);

            log.info("查询结果：总数={}，当前页记录数={}", result.getTotal(), result.getRecords().size());

            PageResult<Labor> pageResult = new PageResult<Labor>(
                result.getCurrent(),
                result.getSize(),
                result.getTotal(),
                result.getRecords()
            );

            return Result.success(pageResult);
        } catch (Exception e) {
            log.error("查询劳务列表失败", e);
            return Result.error("查询失败：" + e.getMessage());
        }
    }

    /**
     * 根据ID查询劳务详情
     * @param id 劳务ID
     * @return 劳务详情
     */
    @GetMapping("/{id}")
    public Result<Labor> getLaborById(@PathVariable Long id) {
        try {
            log.info("查询劳务详情，ID：{}", id);

            Labor labor = laborService.getLaborDetail(id);
            if (labor == null) {
                return Result.error("劳务不存在");
            }

            return Result.success(labor);
        } catch (Exception e) {
            log.error("查询劳务详情失败，ID：{}", id, e);
            return Result.error("查询失败");
        }
    }

    /**
     * 添加劳务
     * @param labor 劳务信息
     * @return 操作结果
     */
    @PostMapping
    public Result<String> addLabor(@RequestBody Labor labor) {
        try {
            log.info("添加劳务，标题：{}", labor.getJobTitle());

            // 参数校验
            if (labor.getJobTitle() == null || labor.getJobTitle().trim().isEmpty()) {
                return Result.error("劳务标题不能为空");
            }

            // 验证学校ID
            if (labor.getSchoolId() == null) {
                return Result.error("学校ID不能为空");
            }

            // 设置默认值
            if (labor.getStatus() == null) {
                labor.setStatus("published");
            }

            // 管理员发布劳务，使用labor中的schoolId
            Labor savedLabor = laborService.publishLabor(labor, 1L, labor.getSchoolId());
            if (savedLabor != null) {
                return Result.success("添加成功");
            } else {
                return Result.error("添加失败");
            }
        } catch (Exception e) {
            log.error("添加劳务失败", e);
            return Result.error("添加失败：" + e.getMessage());
        }
    }

    /**
     * 更新劳务
     * @param id 劳务ID
     * @param labor 劳务信息
     * @return 操作结果
     */
    @PutMapping("/{id}")
    public Result<String> updateLabor(@PathVariable Long id, @RequestBody Labor labor) {
        try {
            log.info("更新劳务，ID：{}，标题：{}", id, labor.getJobTitle());

            // 参数校验
            if (labor.getJobTitle() == null || labor.getJobTitle().trim().isEmpty()) {
                return Result.error("劳务标题不能为空");
            }

            labor.setId(id);
            Labor updatedLabor = laborService.updateLabor(labor, 1L); // 使用管理员ID
            if (updatedLabor != null) {
                return Result.success("更新成功");
            } else {
                return Result.error("更新失败");
            }
        } catch (Exception e) {
            log.error("更新劳务失败，ID：{}", id, e);
            return Result.error("更新失败：" + e.getMessage());
        }
    }

    /**
     * 删除劳务
     * @param id 劳务ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    public Result<String> deleteLabor(@PathVariable Long id) {
        try {
            log.info("删除劳务，ID：{}", id);

            // 检查是否存在
            Labor labor = laborService.getLaborDetail(id);
            if (labor == null) {
                return Result.error("劳务不存在");
            }

            // 这里可以添加删除逻辑，或者只是关闭劳务
            boolean success = laborService.closeLabor(id, 1L); // 使用管理员ID
            if (success) {
                return Result.success("删除成功");
            } else {
                return Result.error("删除失败");
            }
        } catch (Exception e) {
            log.error("删除劳务失败，ID：{}", id, e);
            return Result.error("删除失败：" + e.getMessage());
        }
    }

    /**
     * 切换劳务状态
     * @param id 劳务ID
     * @param requestBody 请求体，包含status字段
     * @return 操作结果
     */
    @PutMapping("/{id}/status")
    public Result<String> toggleStatus(@PathVariable Long id, @RequestBody java.util.Map<String, String> requestBody) {
        try {
            String status = requestBody.get("status");
            log.info("切换劳务状态，ID：{}，状态：{}", id, status);

            // 检查是否存在
            Labor labor = laborService.getLaborDetail(id);
            if (labor == null) {
                return Result.error("劳务不存在");
            }

            // 更新状态
            labor.setStatus(status);
            Labor updatedLabor = laborService.updateLabor(labor, 1L); // 使用管理员ID

            if (updatedLabor != null) {
                String statusText = "published".equals(status) ? "启用" : "关闭";
                return Result.success(statusText + "成功");
            } else {
                return Result.error("操作失败");
            }
        } catch (Exception e) {
            log.error("切换劳务状态失败，ID：{}", id, e);
            return Result.error("操作失败：" + e.getMessage());
        }
    }

    /**
     * 获取劳务统计信息
     * @return 统计信息
     */
    @GetMapping("/stats")
    public Result<com.campus.help.dto.LaborStats> getLaborStats() {
        try {
            log.info("获取劳务统计信息");

            com.campus.help.dto.LaborStats stats = laborService.getLaborStats();
            return Result.success(stats);
        } catch (Exception e) {
            log.error("获取劳务统计信息失败", e);
            return Result.error("获取统计信息失败");
        }
    }
}
